Gästeforum

Gästeforum

am 15.05.2006 18:13:56 von Adics

Hallo zusammen ich habe ein kleines Problem habe jedoch den ganzen Code
zu beseren Verständlichkeit hochgeladen. Ich möchte ein Guestbook in
meine Internet Adresse einbauen, jedoch habe ich ein Problemchen mit
meiner Datenbank! Ich habe drei Tabellen!

Tabelle foren:

+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| name | tinytext | | | | |
+-------+----------+------+-----+---------+----------------+

Tabelle "threads"

+---------+---------------+------+-----+---------+---------- ------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+---------- ------+
| id | int(11) | | PRI | NULL | auto_increment |
| fid | int(11) | | | 0 | |
| topic | tinytext | | | | |
| created | timestamp(14) | | | | |
+---------+---------------+------+-----+---------+---------- ------+

Tabelle answers

+---------+---------------+------+-----+---------+---------- ------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+---------- ------+
| id | int(11) | | PRI | NULL | auto_increment |
| tid | int(11) | | | 0 | |
| fid | int(11) | | | 0 | |
| user | tinytext | | | | |
| topic | tinytext | | | | |
| text | text | | | | |
| created | timestamp(14) | | | | |
+---------+---------------+------+-----+---------+---------- ------+


...zusetzlich habe ich ein Formular in Html geschrieben:







charset=3Dwindows-1252">
Guestbook


"http://www.w3.org/TR/html4/strict.dtd">


Einzeilige Eingabefelder definieren



Guestbook
























Name:
Topic:
Nachricht:
Formular: type=3D"reset" value=3D" Abbrechen">
& maxlength=3D"40" value=3D"1">











... und hier ensteht schon mein Problem




//Herstellen der MySQL verbindung
$con =3D mysql_connect('localhost', 'root', '');
$db =3D mysql_select_db("forum");
//Variablen auf andere Deklarieren (ist einfacher zu schreiben)
$topic =3D $_POST["topic"];
$name =3D $_POST["name"];
$nachricht =3D $_POST["nachricht"];
$fid =3D $_POST["fid"];
//schreiben in DB (nur Thread an sich)
mysql_query("insert into threads set fid=3D'$fid', topic=3D'$topic',
created=3Dnow()");
//nun brauchen wir noch die neue ID des Threads, um sie in answers
// einzutragen
$res =3D mysql_query("select max(id) AS max from threads");
$row =3D mysql_fetch_array($res);
$thread_id =3D $row["max"];

//so nun schreiben wir den eigentlichen Beitrag in die DB
mysql_query("insert into answers set text=3D'$text', topic=3D'$topic',
user=3D'$name', fid=3D'$fid', tid=3D'$thread_id', created=3Dnow()");

//Weiterleitung zu der Auflistung der Threads im
//bereits ausgewählten Forum
header("Location: showthreads.php?fid=3D".$fid);
?>




... wenn ich meine Antworten ansehen will dann erscheinen im Mozilla
nur die Eingaben des Titel des Beitrages und der Name des Autors, aber
es erscheint keine Nachricht! Was mache ich falsch? Ist der
Programmiercode echo "Nachricht: ".$text."
"; falsch? Was muss ich
machen damit die Nachricht als Text in meiner answers Datei im Mozilla
erscheint?





//Herstellen der MySQL verbindung
$con =3D mysql_connect('localhost', 'root', '');
$db =3D mysql_select_db("forum");

//Lesen aus DB
$res =3D mysql_query("select * from answers where fid=3D".$_GET["fid"]."
AND tid=3D".$_GET["tid"]);

//ausgeben
while($row =3D mysql_fetch_array($res)) {
$text =3D nl2br($row["text"]);
echo "

";
echo "Titel des Beitrags: ".$row["topic"]."
";
echo "Name des Autors: ".$row["user"]."
";
echo "Nachricht: ".$text."
";
echo "

";}
?>

//Herstellen der MySQL verbindung
$con =3D mysql_connect('localhost', 'root', '');
$db =3D mysql_select_db("forum");

//Herauslesen der Threads, die in dem Forum stehen
$res =3D mysql_query("select * from threads where fid=3D".$_GET["fid"]);

//Ausgeben der Threads mit Hyperlink auf showanswers.php
//Die jetzige Ausgabe der Tabelle "threads" liefert jetzt
//eine neue Variable mit, die wir auch in den Link
//setzen müssen
while($row =3D mysql_fetch_array($res)) {
echo " href=3D\"showanswers.php?fid=3D".$row["fid"]."&tid=3D".$row[ "id"]."\">";
echo $row["topic"]."
";
}
?>


/* showforen.php */
//Herstellen der MySQL verbindung
$con =3D mysql_connect('localhost', 'root', '');
$db =3D mysql_select_db("forum");

//Herauslesen der Foren
$res =3D mysql_query("select * from foren");

//Ausgeben der Foren mit Hyperlink
while($row =3D mysql_fetch_array($res)) {
echo "";
echo $row["name"]."

";
}
?>

Re: Gästeforum

am 18.05.2006 16:47:05 von Johannes Vogel

Hi Adics

adics wrote:
> Was mache ich falsch?

Du machst ganz vieles falsch:

- Du postest nicht mit Realname
- Du postest ganze Dateien
- Die Formatierung deiner Copy/Paste's sind unleserlich

Korrigiere das, dann ist's auch möglich, dir zu helfen.

Zur Lektüre:
1.17. Wie stelle ich meine Frage an die Newsgroup am sinnvollsten?
http://www.php-faq.de/q/q-newsgroup-fragen.html

Und grad vorweg:
http://learn.to/quote

Dann Inhaltlich machst du grad nochmals eine schwette Sachen falsch:
- Du verbindest dich via root mit der DB. Das ist ungünstig
- Dein DB-root hat kein Passwort zugeteilt
- 16.14. Warum soll ich nicht SELECT * schreiben?
http://www.php-faq.de/q/q-sql-select.html
- - Du solltest {}-Blöcke einrücken
- Du solltest statt "hallo" bei konstanten Werten 'hallo' verwenden
- Du solltest print_r() und var_dump() zum Debugging kennen lernen

Ich glaube, dass sich das Problem mit der Korrektur von solchen
'Nebensächlichkeiten' von alleine löst.

HTH, Johannes

Re: Gästeforum

am 19.05.2006 11:34:06 von Irmgard Schwenteck

adics schrieb:

> ... und hier ensteht schon mein Problem

Bitte - Du mußt nicht ganze HTML-Seiten posten.
Ein link auf die Seite wäre hilfreicher.

> //Variablen auf andere Deklarieren (ist einfacher zu schreiben)
> $topic = $_POST["topic"];

register globals on oder off?


> $res = mysql_query("select max(id) AS max from threads");

nimm mysql_insert_id()


> //so nun schreiben wir den eigentlichen Beitrag in die DB

Was tust Du zur Überprüfung der Eingaben?
trim, mysql_escape_string, strip_tags?

Ich würd außerdem alle Beiträge, die "www" oder "http" enthalten, erst
durch manuellen Eingriff freischalten. Damit schließt Du schon mal den
meisten Gästebuchspam aus.
Läßt Du Dir ein mail zusenden?


> ... wenn ich meine Antworten ansehen will dann erscheinen im Mozilla
> nur die Eingaben des Titel des Beitrages und der Name des Autors, aber
> es erscheint keine Nachricht! Was mache ich falsch? Ist der

Steht der Beitrag in der Datenbank? Mit richtiger ID? Ohne irgendwelche
Steuerzeichen davor?

Wenn ja, liegt die Ursache vermutlich in der Ausgabe der HTML-Seite und
ist kein PHP-Problem mehr.

Gruß
Irmgard

Re: Gästeforum

am 19.05.2006 11:43:16 von Irmgard Schwenteck

Hallo

Johannes Vogel schrieb:

> - Du verbindest dich via root mit der DB. Das ist ungünstig
ist ja möglicherweise aus der Testumgebung herauskopiert.

> - Dein DB-root hat kein Passwort zugeteilt

Na das würd ich aber keinesfalls in ein posting schreiben ;)

@ adics:

es ist sehr von Vorteil, die Verbindungskennung in ein extra PHP-File zu
schreiben, was dann in jedem script includet wird.

Dann kannst Du auch ohne Aufwand zwischen lokaler Umgebung und der
eigentlichen website wechseln:

if ($HTTP_HOST=='meinpc') {
$host = "meinpc";
$user = ...
$pwd = ...
$database = ...
}
else {
$host = "localhost";
$user = (in der Regel vom provider zugewiesen);
$pwd = ...
$database = ...
}

Gruß
Irmgard

Re: Gästeforum

am 19.05.2006 13:11:50 von Johannes Vogel

Hi Irmgard

Irmgard Schwenteck wrote:
> Johannes Vogel schrieb:
>> - Du verbindest dich via root mit der DB. Das ist ungünstig
> ist ja möglicherweise aus der Testumgebung herauskopiert.

Davon geh ich mal aus. Aber auch da ist ein User schnell eingerichtet.
Grundsatz: root wird *niemals* irgendwo in Scripts verwendet.

>> - Dein DB-root hat kein Passwort zugeteilt
> Na das würd ich aber keinesfalls in ein posting schreiben ;)

Ich auch nicht. Scheint aber nicht so, als hätte adics das angepasst.

> @ adics:
> es ist sehr von Vorteil, die Verbindungskennung in ein extra PHP-File zu
> schreiben, was dann in jedem script includet wird.

ACK

> Dann kannst Du auch ohne Aufwand zwischen lokaler Umgebung und der
> eigentlichen website wechseln:
> if ($HTTP_HOST=='meinpc') {

register_globals gehört ausgeschaltet. Also $_SERVER['HTTP_HOST']...

HTH, Johannes

Re: Gästeforum

am 19.05.2006 14:55:25 von Irmgard Schwenteck

Hallo

Johannes Vogel schrieb:

> register_globals gehört ausgeschaltet. Also $_SERVER['HTTP_HOST']...

ähhemm... natürlich.
Hatte es schnell aus einem alten script herauskopiert, das sollte man
eben nicht tun.


Gruß
Irmgard